package com.kurt.repository;

import com.kurt.entity.SysRoleMenu;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 角色菜单关联Repository接口
 * 提供角色菜单关联数据访问方法
 */
@Repository
public interface SysRoleMenuRepository extends JpaRepository<SysRoleMenu, Long> {

    /**
     * 根据角色ID查找角色菜单关联列表
     *
     * @param roleId 角色ID
     * @return 角色菜单关联列表
     */
    List<SysRoleMenu> findByRoleId(Long roleId);

    /**
     * 根据菜单ID查找角色菜单关联列表
     *
     * @param menuId 菜单ID
     * @return 角色菜单关联列表
     */
    List<SysRoleMenu> findByMenuId(Long menuId);

    /**
     * 根据角色ID列表查找角色菜单关联列表
     *
     * @param roleIds 角色ID列表
     * @return 角色菜单关联列表
     */
    List<SysRoleMenu> findByRoleIdIn(List<Long> roleIds);

    /**
     * 根据菜单ID列表查找角色菜单关联列表
     *
     * @param menuIds 菜单ID列表
     * @return 角色菜单关联列表
     */
    List<SysRoleMenu> findByMenuIdIn(List<Long> menuIds);

    /**
     * 根据角色ID和菜单ID查找角色菜单关联
     *
     * @param roleId 角色ID
     * @param menuId 菜单ID
     * @return 角色菜单关联
     */
    SysRoleMenu findByRoleIdAndMenuId(Long roleId, Long menuId);

    /**
     * 根据角色ID删除角色菜单关联
     *
     * @param roleId 角色ID
     */
    void deleteByRoleId(Long roleId);

    /**
     * 根据菜单ID删除角色菜单关联
     *
     * @param menuId 菜单ID
     */
    void deleteByMenuId(Long menuId);

    /**
     * 根据角色ID和菜单ID删除角色菜单关联
     *
     * @param roleId 角色ID
     * @param menuId 菜单ID
     */
    void deleteByRoleIdAndMenuId(Long roleId, Long menuId);

    /**
     * 批量删除角色菜单关联
     *
     * @param roleId  角色ID
     * @param menuIds 菜单ID列表
     */
    @Modifying
    @Query("DELETE FROM SysRoleMenu rm WHERE rm.roleId = :roleId AND rm.menuId IN :menuIds")
    void deleteByRoleIdAndMenuIdIn(@Param("roleId") Long roleId, @Param("menuIds") List<Long> menuIds);

    /**
     * 检查角色菜单关联是否存在
     *
     * @param roleId 角色ID
     * @param menuId 菜单ID
     * @return 是否存在
     */
    boolean existsByRoleIdAndMenuId(Long roleId, Long menuId);
}
